package co.gov.medellin.ssti.sub.model.dao;

import java.util.Collection;
import java.util.List;

import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;

public interface AtributosDAO {
	/**
	 * Metodo que retorna los atributos de un subprograma.
	 * 
	 * @param codeSubprograma
	 *            Codigo del subprograma cuyos atributos se buscan.
	 * @param vigencia
	 *            "I": inactivo. "A": activo.
	 * @param opcion
	 *            0: Busca atributos no importa la restriccion (REST_CODIGO
	 *            puede o no ser NULL). Para cualquier otro valor de opcion:
	 *            Busca atributos con REST_CODIGO NULL.
	 * @return Collection AtributoVO. Obtiene la lista de atributos de
	 *         TCS_BEN_SUBP_ATR_BENEFICIARIO
	 */
	Collection<AtributoVO> findAtributosSubprograma(Long codeSubprograma,
			String vigencia, int opcion);

	/**
	 * Metodo que consulta el atributo ENTE (NOMBRE = 'GESTOR') en
	 * TCS_BEN_SUBP_ATR_BENEFICIARIO de un subprograma.
	 * 
	 * @param codigoSubprograma
	 *            Codigo del subprograma.
	 * @return AtributoVO. Retorna null si no tiene este atributo.
	 * 
	 */
	AtributoVO findAtributoEGSubprograma(Long codeSubprograma);

	/**
	 * Metodo que consulta un atributo por codigo del atributo y vigencia.
	 * 
	 * @param codigoAtributo
	 *            Codigo del atributo.
	 * @param vigencia
	 *            Valor de vigencia del atributo ("A", "I" para activo o
	 *            inactivo, respectivamente).
	 * @return AtributoVO. Retorna null si no existe el codigo (o no coincide la
	 *         vigencia).
	 * 
	 */
	AtributoVO findAtributoByCodigoAndVigencia(Long codigoAtributo,
			String vigencia);

	/**
	 * Metodo que consulta un atributo por codigo del atributo.
	 * 
	 * @param codigoAtributo
	 *            Codigo del atributo.
	 * @return AtributoVO. Retorna null si no existe el codigo.
	 * 
	 */
	AtributoVO findAtributoByCodigo(Long codigoAtributo);

	/**
	 * Metodo que consulta el codigo con valor maximo en TCS_BEN_RESTRICCION
	 * 
	 * @return int con el valor del CODIGO maximo en TCS_BEN_RESTRICCION.
	 * @throws DAOException
	 */
	int findMaxCodigoRestriccion();

	/**
	 * TODO: WTF IS THIS SHIT.
	 * 
	 * @param codeSubprograma
	 *            Codigo del subprograma.
	 * @return
	 * @throws DAOException
	 */
	int findAtributosValidarLista(Long codeSubprograma);

	/**
	 * Metodo que hace un merge into TCS_BEN_BENEFICIARIO_ATRIBUTO.
	 * 
	 * @param strValor
	 *            Valor del atributo.
	 * @param strTipodato
	 *            Tipo de dato del atributo. ("A", "L", "N", "F").
	 * @param codeAtributo
	 *            Codigo del atributo.
	 * @param codeBeneficiario
	 *            Codigo del beneficiario.
	 * @param i
	 * @param strArrIns
	 *            String[] de parametros.
	 * @return
	 * 
	 */
	int insertBeneficiarioAtri(String strValor, String strTipodato,
			Long codeAtributo, Long codeBeneficiario, int i, String strArrIns[]);

	/**
	 * 
	 * @param strValor
	 * @param strTipodato
	 * @param codeAtri
	 * @param codeBot
	 * @param i
	 * @param strArrIns
	 * @return
	 * 
	 */
	int insertBeneficioAtri(String strValor, String strTipodato, Long codeAtri,
			Long codeBot, int i, String strArrIns[]);

	/**
	 * 
	 * @param strValor
	 * @param strTipodato
	 * @param codeAtri
	 * @param codeBot
	 * @param i
	 * @param strArrIns
	 * @return
	 * 
	 */
	int updateBeneficioAtri(String strValor, String strTipodato, Long codeAtri,
			Long codeBot, int i, String strArrIns[]);

	/**
	 * 
	 * @param arr
	 * @return
	 * 
	 */
	int insertRestriccion(String arr[]);

	/**
	 * 
	 * @param codeSubprograma
	 * @param codeAtri
	 * @return
	 * 
	 */
	int activarAtributo(Long codeSubprograma, Long codeAtri);

	/**
	 * 
	 * @param codeSubprograma
	 * @param codeAtri
	 * @param codeMaxRest
	 * @param strArrAct
	 * @return
	 */
	int updateCampoRestAtri(Long codeSubprograma, Long codeAtri,
			Long codeMaxRest, String strArrAct[]);

	/**
	 * 
	 * @param codeSubprog
	 * @return
	 * 
	 */
	List<AtributoVO> findAtributosSAB(Long codeSubprog);

	/**
	 * 
	 * @param codeAtri
	 * @return
	 * 
	 */
	String findNombreAtributoSAB(Long codeAtri);

	/**
	 * 
	 * @param strIncrement
	 * @return
	 * 
	 */
	String findFechaBeneficio(String strIncrement);

	/**
	 * Metodo que consulta el codigo del atributo generico a partir del nombre
	 * en TCS_BEN_ATR_GENERICO.
	 * 
	 * @param nombreAtri
	 *            Nombre del atributo generico.
	 * @return Codigo del atributo generico.
	 * 
	 */
	String findCodeAtributoGenerico(String nombreAtri);
	
	String findTTVFCodeAtributoGenerico(String nombreAtri);

	/**
	 * Metodo que actualiza la columna VALIDAR_LISTA y VALOR_SUGERIDO de
	 * TCS_BEN_SUBP_ATR_BENEFICIARIO a 'N' y '' respectivamente, del registro
	 * con CODIGO = codeAtri.
	 * 
	 * @param codeAtri
	 *            Codigo del atributo del beneficio.
	 * @return Numero de registros actualizados. 0 si no realiza la
	 *         actualizacion.
	 * 
	 */
	int updateValidarLista(Long codeAtri);

	/**
	 * Consulta los atributos (tcs_ben_subp_atr_beneficiario) de los
	 * subprogramas que han sido entregados a empresas.
	 * 
	 * @return
	 */
	Collection<AtributoVO> findAtributoSubprogramaBOTEmpresa();

}
